import java.io.File;
import java.io.RandomAccessFile;

import javax.swing.JOptionPane;

/**
 *
 * @author Esteban
 *
 */
public class RAM {

	// atributos de clase
	private int capacidad;
	private int numeroDeLineas;
	private RandomAccessFile raf;
	private File f;
	/**
	 * crea el archivo con el nombre de RAM.txt
	 */
	public RAM() {
		f = new File("RAM.txt");
		numeroDeLineas = (int) Math.pow(2, Utilidades.LINEASDIRECCION);
		capacidad = numeroDeLineas * Utilidades.TAMANOPALABRA;
		crearRAM(numeroDeLineas);
	}

	/**
	 * metodo para crear la ram
	 *
	 * @param lineas,
	 *            lineas que va a soportar la ram
	 */
	public void crearRAM(int lineas) {
		try {
			raf = new RandomAccessFile(f, "rw");
			// si no esta vacia, no volverla a crear.
			if (raf.length() > 0 && raf.length() == capacidad) {
				return;
			}
			raf.setLength(0);
			// si el tamaño del archivo es 0Bytes crear la RAM
			for (int i = 0; i < lineas * Utilidades.TAMANOPALABRA; i++) {
				raf.seek(i);
				raf.write((int) (Math.random() * 255));
			}
			raf.close();
			JOptionPane.showMessageDialog(null, "RAM creada con exito");
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Ocurrio un error y no se a podido crear la memoria RAM");
		}
	}

	/**
	 * metodo para leer una linea de la ram
	 *
	 * @param linea,
	 *            linea de la que se quiere leer
	 * @return el dato que se encuentra en la linea
	 */
	public int leerLinea(int linea) {
		int dato = 0;
		try {
			RandomAccessFile raf = new RandomAccessFile(f, "rw");
			for (int i = linea * Utilidades.TAMANOPALABRA; i < linea
					* Utilidades.TAMANOPALABRA + Utilidades.TAMANOPALABRA; i++) {
				raf.seek(i);
				dato = (int) raf.read();
			}
			raf.close();
			return dato;
		} catch (Exception e) {
		}
		return dato;
	}

	/**
	 * metodo para guardar una linea en la ram
	 *
	 * @param linea,
	 *            linea en la que se quiere guardar
	 * @param byte1,
	 *            dato que se quiere guardar
	 */
	public void guardarLinea(int linea, int byte1) {
		try {
			RandomAccessFile raf = new RandomAccessFile(f, "rw");
			raf.seek(linea * Utilidades.TAMANOPALABRA);
			raf.write(byte1);
			raf.close();
		} catch (Exception e) {
		}
	}

	/**
	 * metodo para leer un bloque
	 *
	 * @param linea,
	 *            linea de la cual se quiere obtener el bloque
	 * @return arreglo de 4 posiciones con el bloque
	 */
	public int[] leerBloque(int linea) {
		int inicioBloque = Utilidades.calcularBloqueRam(linea);
		int[] bloque = new int[Utilidades.PALABRASPORLINEA];
		for (int i = inicioBloque; i < (inicioBloque + Utilidades.PALABRASPORLINEA); i++) {
			bloque[i - inicioBloque] = leerLinea(i);
		}
		return bloque;
	}

	/**
	 * metodo para leer un bloque
	 *
	 * @param linea,
	 *            linea de la cual se quiere obtener el bloque
	 * @return arreglo de 4 posiciones con el bloque
	 */
	public void escribirBloque(int linea,int[] bloque) {
		int inicioBloque = Utilidades.calcularBloqueRam(linea);
		for (int i = inicioBloque; i < (inicioBloque + Utilidades.PALABRASPORLINEA); i++) {
			guardarLinea(i, bloque[i-inicioBloque]);
		}
	}


}
